import datetime
from flask import request, jsonify, g
from flask_jwt_extended import jwt_required, get_jwt_identity, get_jwt
from app.models import Admin, Role, Permission, RolePermission, AdminLog
from app.core.extensions import db
from . import admin_blueprint


@admin_blueprint.route('/roles', methods=['GET'])
@jwt_required()
def get_roles():
    """获取角色列表"""
    current_user_id = get_jwt_identity()
    admin = Admin.query.get(current_user_id)
    
    if not admin:
        return jsonify({'code': 1, 'message': '管理员不存在'}), 404
    
    # 如果是租户管理员，只能查看自己租户的角色
    if admin.tenant_id:
        roles = Role.query.filter_by(tenant_id=admin.tenant_id).all()
    else:
        # 超级管理员可以查看所有角色
        roles = Role.query.all()
    
    result = []
    for role in roles:
        result.append({
            'id': role.id,
            'name': role.name,
            'description': role.description,
            'created_at': role.created_at.strftime('%Y-%m-%d %H:%M:%S') if role.created_at else None,
            'tenant_id': role.tenant_id
        })
    
    return jsonify({'code': 0, 'message': '获取成功', 'data': result})


@admin_blueprint.route('/roles/<int:role_id>', methods=['GET'])
@jwt_required()
def get_role(role_id):
    """获取角色详情"""
    current_user_id = get_jwt_identity()
    admin = Admin.query.get(current_user_id)
    
    if not admin:
        return jsonify({'code': 1, 'message': '管理员不存在'}), 404
    
    role = Role.query.get(role_id)
    if not role:
        return jsonify({'code': 1, 'message': '角色不存在'}), 404
    
    # 检查权限：只能查看自己租户的角色
    if admin.tenant_id and role.tenant_id != admin.tenant_id:
        return jsonify({'code': 1, 'message': '没有权限查看此角色'}), 403
    
    return jsonify({
        'code': 0, 
        'message': '获取成功', 
        'data': role.to_dict()
    })


@admin_blueprint.route('/roles', methods=['POST'])
@jwt_required()
def create_role():
    """创建角色"""
    current_user_id = get_jwt_identity()
    admin = Admin.query.get(current_user_id)
    claims = get_jwt()
    
    # 测试账号不能创建角色
    if claims.get('is_test'):
        return jsonify({'code': 1, 'message': '测试账号不能创建角色'}), 403
    
    if not admin:
        return jsonify({'code': 1, 'message': '管理员不存在'}), 404
    
    data = request.json
    name = data.get('name')
    description = data.get('description', '')
    
    if not name:
        return jsonify({'code': 1, 'message': '角色名称不能为空'}), 400
    
    # 检查角色名是否已存在
    existing_role = Role.query.filter_by(name=name).first()
    if existing_role:
        return jsonify({'code': 1, 'message': '角色名称已存在'}), 400
    
    try:
        # 创建新角色
        role = Role(
            name=name,
            description=description,
            tenant_id=admin.tenant_id  # 关联到当前租户
        )
        db.session.add(role)
        
        # 处理权限
        permissions = data.get('permissions', [])
        if permissions:
            for perm_id in permissions:
                perm = Permission.query.get(perm_id)
                if perm:
                    role.permissions.append(perm)
        
        # 记录操作日志
        log = AdminLog(
            admin_id=admin.id,
            action='创建角色',
            ip=request.remote_addr,
            details=f'创建角色 {name}'
        )
        db.session.add(log)
        
        db.session.commit()
        
        return jsonify({
            'code': 0, 
            'message': '创建成功', 
            'data': {'id': role.id}
        })
        
    except Exception as e:
        db.session.rollback()
        return jsonify({'code': 1, 'message': f'创建失败: {str(e)}'}), 500


@admin_blueprint.route('/roles/<int:role_id>', methods=['PUT'])
@jwt_required()
def update_role(role_id):
    """更新角色"""
    current_user_id = get_jwt_identity()
    admin = Admin.query.get(current_user_id)
    claims = get_jwt()
    
    # 测试账号不能更新角色
    if claims.get('is_test'):
        return jsonify({'code': 1, 'message': '测试账号不能更新角色'}), 403
    
    if not admin:
        return jsonify({'code': 1, 'message': '管理员不存在'}), 404
    
    role = Role.query.get(role_id)
    if not role:
        return jsonify({'code': 1, 'message': '角色不存在'}), 404
    
    # 检查权限：只能更新自己租户的角色
    if admin.tenant_id and role.tenant_id != admin.tenant_id:
        return jsonify({'code': 1, 'message': '没有权限更新此角色'}), 403
    
    data = request.json
    name = data.get('name')
    description = data.get('description')
    
    if not name:
        return jsonify({'code': 1, 'message': '角色名称不能为空'}), 400
    
    # 检查角色名是否已存在（排除自身）
    existing_role = Role.query.filter(Role.name == name, Role.id != role_id).first()
    if existing_role:
        return jsonify({'code': 1, 'message': '角色名称已存在'}), 400
    
    try:
        # 更新角色信息
        role.name = name
        if description is not None:
            role.description = description
        
        # 处理权限
        permissions = data.get('permissions')
        if permissions is not None:
            # 清除现有权限
            role.permissions = []
            
            # 添加新权限
            for perm_id in permissions:
                perm = Permission.query.get(perm_id)
                if perm:
                    role.permissions.append(perm)
        
        # 记录操作日志
        log = AdminLog(
            admin_id=admin.id,
            action='更新角色',
            ip=request.remote_addr,
            details=f'更新角色 {name}'
        )
        db.session.add(log)
        
        db.session.commit()
        
        return jsonify({'code': 0, 'message': '更新成功'})
        
    except Exception as e:
        db.session.rollback()
        return jsonify({'code': 1, 'message': f'更新失败: {str(e)}'}), 500


@admin_blueprint.route('/roles/<int:role_id>', methods=['DELETE'])
@jwt_required()
def delete_role(role_id):
    """删除角色"""
    current_user_id = get_jwt_identity()
    admin = Admin.query.get(current_user_id)
    claims = get_jwt()
    
    # 测试账号不能删除角色
    if claims.get('is_test'):
        return jsonify({'code': 1, 'message': '测试账号不能删除角色'}), 403
    
    if not admin:
        return jsonify({'code': 1, 'message': '管理员不存在'}), 404
    
    role = Role.query.get(role_id)
    if not role:
        return jsonify({'code': 1, 'message': '角色不存在'}), 404
    
    # 检查权限：只能删除自己租户的角色
    if admin.tenant_id and role.tenant_id != admin.tenant_id:
        return jsonify({'code': 1, 'message': '没有权限删除此角色'}), 403
    
    # 检查角色是否被使用
    if role.admins.count() > 0:
        return jsonify({'code': 1, 'message': '该角色已分配给用户，不能删除'}), 400
    
    try:
        # 记录操作日志
        log = AdminLog(
            admin_id=admin.id,
            action='删除角色',
            ip=request.remote_addr,
            details=f'删除角色 {role.name}'
        )
        db.session.add(log)
        
        # 删除角色
        db.session.delete(role)
        db.session.commit()
        
        return jsonify({'code': 0, 'message': '删除成功'})
        
    except Exception as e:
        db.session.rollback()
        return jsonify({'code': 1, 'message': f'删除失败: {str(e)}'}), 500


@admin_blueprint.route('/roles/<int:role_id>/permissions', methods=['GET'])
@jwt_required()
def get_role_permissions(role_id):
    """获取角色的权限"""
    current_user_id = get_jwt_identity()
    admin = Admin.query.get(current_user_id)
    
    if not admin:
        return jsonify({'code': 1, 'message': '管理员不存在'}), 404
    
    role = Role.query.get(role_id)
    if not role:
        return jsonify({'code': 1, 'message': '角色不存在'}), 404
    
    # 检查权限：只能查看自己租户的角色
    if admin.tenant_id and role.tenant_id != admin.tenant_id:
        return jsonify({'code': 1, 'message': '没有权限查看此角色'}), 403
    
    # 获取权限ID列表
    permission_ids = [p.id for p in role.permissions]
    
    return jsonify({
        'code': 0, 
        'message': '获取成功', 
        'data': permission_ids
    })


@admin_blueprint.route('/roles/<int:role_id>/permissions', methods=['PUT'])
@jwt_required()
def update_role_permissions(role_id):
    """更新角色的权限"""
    current_user_id = get_jwt_identity()
    admin = Admin.query.get(current_user_id)
    claims = get_jwt()
    
    # 测试账号不能更新权限
    if claims.get('is_test'):
        return jsonify({'code': 1, 'message': '测试账号不能更新权限'}), 403
    
    if not admin:
        return jsonify({'code': 1, 'message': '管理员不存在'}), 404
    
    role = Role.query.get(role_id)
    if not role:
        return jsonify({'code': 1, 'message': '角色不存在'}), 404
    
    # 检查权限：只能更新自己租户的角色
    if admin.tenant_id and role.tenant_id != admin.tenant_id:
        return jsonify({'code': 1, 'message': '没有权限更新此角色'}), 403
    
    data = request.json
    permissions = data.get('permissions', [])
    
    try:
        # 清除现有权限
        role.permissions = []
        
        # 添加新权限
        for perm_id in permissions:
            perm = Permission.query.get(perm_id)
            if perm:
                role.permissions.append(perm)
        
        # 记录操作日志
        log = AdminLog(
            admin_id=admin.id,
            action='更新角色权限',
            ip=request.remote_addr,
            details=f'更新角色 {role.name} 的权限'
        )
        db.session.add(log)
        
        db.session.commit()
        
        return jsonify({'code': 0, 'message': '更新成功'})
        
    except Exception as e:
        db.session.rollback()
        return jsonify({'code': 1, 'message': f'更新失败: {str(e)}'}), 500 